package 题目集.线段树or树状数组.树状数组;

import java.io.*;

/**
 * todo:还得做
 * https://www.luogu.com.cn/problem/P2184
 * 题意：
 *  有两个操作：
 *      1：给【l,r】贴一层报纸。
 *      2：问【l,r】最多有多少种报纸（被覆盖的也算）。
 * 暴力：
 *      第一思路：
 *          贴操作给【l,r】区间++，查询操作，查询区间和。或区间最大值，但无论哪种都是错的。
 *
 *      我们可以记录每个位置的以该点为起点的次数，和以该点为终点的次数。
 *      当问【l,r】时，相当于问 r前面的起点个数-l前面的终点个数。
 */
public class ch09_贪婪大陆 {
    static int[] startTree, endTree;
    static int n, m;

    public static void main(String[] args) {
        Reader2 sc = new Reader2(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        startTree = new int[n + 1];
        endTree = new int[n + 1];
        for (int i = 0; i < m; i++) {
            int op = sc.nextInt();
            int l = sc.nextInt();
            int r = sc.nextInt();
            if (op == 1) {
                add(startTree, l, 1);
                add(endTree, r, 1);
            } else {
                int allS = query(startTree, r);
                int allE = query(endTree, l - 1);
                System.out.println(allS - allE);
            }
        }
    }

    public static void add(int[] tree, int i, int v) {
        for (; i <= n; i += lowbit(i)) tree[i] += v;
    }

    public static int query(int[] tree, int i) {
        int res = 0;
        for (; i > 0; i -= lowbit(i)) res += tree[i];
        return res;
    }

    public static int lowbit(int x) {
        return x & -x;
    }
    static class Reader2 {
        static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        public Reader2(Object... o) {
        }

        public int nextInt() {
            try {
                in.nextToken();
            } catch (Exception ignored) {}
            return (int) in.nval;
        }
    }

}
